/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;

import java.io.Serializable;
import java.util.Iterator;
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import controlador.CtrlPersistencia;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;

/**
 *
 * @author diego
 */
@Entity
public class Fila implements Serializable, Comparable {
    
   @Id   
   @Column(name="FILA_ID")
   private Integer id;
   
   @Basic
   private String nro;   
   
   @OneToMany(mappedBy="fila")   
   @JoinTable(name="FILA_BUTACA",joinColumns={@JoinColumn(name="FILA_ID", referencedColumnName="FILA_ID")},inverseJoinColumns={@JoinColumn(name="BUTACA_ID",referencedColumnName="BUTACA_ID", unique=true)})
   private Set<Butaca> butacas;
   
   @ManyToOne
   @JoinColumn(name="SECCION_ID")
   private Seccion seccion;
   
   @Basic
   private boolean estado;

   public Fila() {
   }

    public Fila(Integer id,String nro, Seccion miSeccion) {   
        this.id = id;
        this.nro = nro;              
        this.seccion = miSeccion;
        this.estado = true;
        this.butacas = new HashSet();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNro() {
        return nro;
    }

    public void setNro(String nro) {
        this.nro = nro;
    }

    public Set<Butaca> getButacas() {
        return butacas;
    }

    public void setButacas(Set<Butaca> butacas) {
        this.butacas = butacas;
    }

    public Seccion getMiSeccion() {
        return seccion;
    }

    public void setMiSeccion(Seccion miSeccion) {
        this.seccion = miSeccion;
    }

    public boolean isEstado() {
        return estado;
    }

    public void setEstado(boolean estado) {
        this.estado = estado;
    }
    
    public void deshabilitar(){
        this.setEstado(false);
    }
    public void habilitar(){
        this.setEstado(true);
    }
    public String seccionNro(){
        return this.seccion.getCodigo()+"-"+this.getNro();
    }
    
    public void quitarButacas(){
        Iterator it = this.butacas.iterator();
        Butaca unaButaca;
        while(it.hasNext()){
            unaButaca = (Butaca) it.next();
            unaButaca.deshabilitar();
        }
    }
    
    public void modificar(String unNro,boolean unEstado){
        this.setNro(unNro);
        this.setEstado(unEstado);
    }
   @Override
    public String toString(){
        return this.getNro();
    }
    
    public Set<Butaca> obtenerButacas(){
        Set<Butaca> lista;
        lista = CtrlPersistencia.listaDeButacas(this);
        this.setButacas(lista);
        return lista;
    }
    public void agregarButaca(String nro,boolean estado) throws Exception{
        Integer id = this.maxButacaId()+1;
        Butaca butaca = new Butaca (id,this,nro,estado);
        this.butacas.add(butaca);
        CtrlPersistencia.crearButaca(butaca);
        CtrlPersistencia.modificarFila(this);
    }
    public Integer maxButacaId(){
        return CtrlPersistencia.maxButacaId();
    }
    public int lugarAlternado(Butaca butaca, int total){                
        int nroButaca = Integer.parseInt(butaca.getNro());
        if(isPar(nroButaca)){
            return total - (this.cuantosParesAntes(nroButaca) + 1);
        }else{
            return cuantosImparesAntes(nroButaca);
        }
    }
    public boolean isPar(int nro){
       return nro%2==0;
    }
    public int cuantosParesAntes(int nro){
        int var = 2;
        int cont = 0;
        while(var < nro){
            var = var + 2;
            cont = cont + 1;
        }
        return cont;
    }
    public int cuantosImparesAntes(int nro){
        int var = 1;
        int cont = 0;
        while(var < nro){
            var = var + 2;
            cont = cont + 1;
        }
        return cont;
    }
    
    public ArrayList<Butaca> obtenerButacasOrdenadas(int criterio){
        ArrayList<Butaca> lista = new ArrayList();
        Iterator it = this.obtenerButacas().iterator();
        Butaca but;
        //lista.ensureCapacity(this.obtenerButacas().size() - 1);
        lista.addAll(this.obtenerButacas());
        
        switch (criterio) {
            case 1: // agrego ordenado                
                while(it.hasNext()){
                    but = (Butaca) it.next();                    
                    lista.set(Integer.parseInt(but.getNro())-1, but);
                    
                }
                break;
            case 2: //agrego alternado
                while(it.hasNext()){
                    but = (Butaca) it.next();                    
                    lista.set(this.lugarAlternado(but,this.getButacas().size()), but);
                }
                break;
        }           
        
        return lista;
    }

    @Override
    public int compareTo(Object o) {
        Fila fila = (Fila) o;
        if(Integer.parseInt(this.getNro()) > Integer.parseInt(fila.getNro())){
            return 1;
        }else{
            return -1;
        }
    }
    
    public int capacidad(){
        return this.butacasActivas();
    }
    
    public int butacasActivas(){        
        Iterator it = this.obtenerButacas().iterator();
        //Butaca but;
        int cont = 0;
        while(it.hasNext()){
           Butaca but = (Butaca) it.next();
            if(but.isEstado()){
                cont = cont + 1;
            }
        }
        return cont;
        
    }
   
   
   
    
}
